#include "axp2101.h"
#include "board.h"
#include "display.h"

#include <esp_log.h>

#define TAG "Axp2101"

/**
 * @brief AXP2101构造函数
 * 
 * @param i2c_bus I2C总线句柄
 * @param addr 设备I2C地址
 */
Axp2101::Axp2101(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) {
}

/**
 * @brief 获取电池电流方向
 * 
 * @return int 电流方向：1表示充电，2表示放电，0表示无电流
 */
int Axp2101::GetBatteryCurrentDirection() {
    return (ReadReg(0x01) & 0b01100000) >> 5;
}

/**
 * @brief 检查电池是否正在充电
 * 
 * @return bool 充电状态，true表示正在充电
 */
bool Axp2101::IsCharging() {
    return GetBatteryCurrentDirection() == 1;
}

/**
 * @brief 检查电池是否正在放电
 * 
 * @return bool 放电状态，true表示正在放电
 */
bool Axp2101::IsDischarging() {
    return GetBatteryCurrentDirection() == 2;
}

/**
 * @brief 检查电池是否充满
 * 
 * @return bool 充满状态，true表示电池已充满
 */
bool Axp2101::IsChargingDone() {
    uint8_t value = ReadReg(0x01);
    return (value & 0b00000111) == 0b00000100;
}

/**
 * @brief 获取电池电量百分比
 * 
 * @return int 电池电量(0-100)
 */
int Axp2101::GetBatteryLevel() {
    return ReadReg(0xA4);
}

/**
 * @brief 关闭设备电源
 * 
 * 通过设置AXP2101寄存器关闭系统电源
 */
void Axp2101::PowerOff() {
    uint8_t value = ReadReg(0x10);
    value = value | 0x01;
    WriteReg(0x10, value);
}
